//引入加密方法
const crypto = require('crypto')
//定义加密算法
const secret = 'giggoooooo'

//引入path
const path = require('path')
//引入文件方法
const fs = require('fs')
//引入图片上传方法
const formidable = require('formidable')


//引入model定义的方法
const { insertUser,isUserExist, isUserLoginExist} = require('../model/user')

//定义register方法，
//调用 isUserExist 判断用户是否存在，防止重复注册
const register = (req, resp) =>{
    //new一个formidable实例，引用IncomingForm()方法
    var form = new formidable.IncomingForm()
    //配置存储路径
    form.uploadDir = path.resolve(__dirname, '../public/images')
    //保留后缀名
    form.keepExtensions = true

    form.parse(req,function(err,fields,files){
        if(err) throw err
        else{
            //fields  --除去图片外的信息
            const { username, password } = fields
            //获取磁盘路径
            const avatarPath = files.avatar.path
            //获取图片文件的名称
            
            let { base } = path.parse(avatarPath)
            
        //    if(base = ""){
        //        base = 'upload_0cb5f7d590ee31e262bcaccc205f5082.gif'
        //    }
            

            isUserExist({ username }).then(isExist =>{
                if(isExist){
                    //用户存在,传到后台的文件删除
                    fs.unlink(avatarPath, (err) =>{
                        if(err) throw err
                        else{
                            resp.json({
                                code: 300,
                                body: {
                                msg: '用户已存在'
                                }
                            })
                        }
                    })
                }else{
                    //用户不存在，信息写入数据库
                    const hash = crypto.createHmac('sha256',secret)
                                .update(password)
                                .digest('hex')
                    insertUser({ username, password: hash, avatar:'/images/' + base}).then(user =>{
                        resp.json({
                            code: 200,
                            body: {
                            msg: '注册成功',
                            user
                            }
                        }).catch(err => {
                            resp.json({
                            code: 400,
                            body: {
                                msg: '网络错误，请重试',
                                err
                            }
                            })
                        })
                    })
                }
            }).catch(err =>{
                resp.json({
                    code: 400,
                    body: {
                    msg: '网络错误，请重试',
                    err
                    }
                })
            })
        }
    })     
}

//根据用户名查找信息，并返回前端
const login = (req, resp) =>{
    const { username, password, expires} = req.body
    
    //输入的密码加密
    const hash = crypto.createHmac('sha256',secret)
                    .update(password)
                    .digest('hex')

    isUserLoginExist({ username, password: hash}).then(user =>{
      
        if(user.length > 0){
            //登陆成功 ->会话存储 -> 产生随机字符
            //随机字符跟着resp.json存入前端cookie

            //7天免登陆
            if(expires === '7'){
                req.sessionOptions = {
                    maxAge: 7 * 24 * 3600 * 1000
                }
            }

            //获取图片
            const { avatar } = user[0]

            // username, avatar ->会话存储
            req.session = {
                isLogin:true,
                username,
                avatar
            }
            resp.json({
                code: 200,
                msg: '登录成功',
            })
        }else{
            resp.json({
                code: 300,
                msg: '密码错误',
             })
        }
    }).catch(err =>{
        resp.json({
            code: 400,
            msg: '网络错误，请重试',
            err
         })
    })
}

const isLogin = (req, resp) =>{
    //取到cookie,验证token令牌是否跟存入的一样
    //能取到，说明令牌比对正确
    if(req.session.isLogin){
        resp.json({
            code: 200,
            body: {
              msg: '已登录',
              username:req.session.username,
              avatar: req.session.avatar
            }
        })
    }else{
        resp.json({
            code: 400,
            body: {
              msg: '未登录',
            }
        })
    }
}

const unLogin = (req, resp) =>{
    //清空session
    req.session = null
    resp.json({
        code:200,
        msg:'退出成功'
    })
}

module.exports = {
    register,
    login,
    isLogin,
    unLogin
}
